// 对象和实例

// 在ES6之前不能用class关键字定义类，
// 因此在JavaScript都是借助于function来定义"类"，
// 为了区分"类"与普通函数，通常将"类"名的每个单词首字母大写
// 早期也将用function定义的"类"称作"对象"，后来仅将其称作"构造函数"
function Student(id,name,age){
    // 当以普通函数执行当前函数时，`new.target`取值为`undefined`
    // 当以构造函数执行当前函数时,`new.target`指向即将调用的构造函数
    if( new.target ) {
        // 通过this为新创建的实例绑定实例属性
        this.id = id;
        this.name = name ;
        this.age = age;
        // 通过this为新创建的实例绑定实例方法
        this.introduce = function(){
            console.log(`我叫${this.name}，今年虚岁${this.age}`);
        }
    } else {
        console.log(`当作普通函数来调用`);
    }
}

// 将 Student 当作构造函数使用
// 紧跟在 new 之后的函数被当作"构造函数"使用
let instance = new Student( 1001, '阿芳', 22 );
console.log( instance );
// 调用实例方法
instance.introduce();

// 将 Student 当作普通函数来使用
Student( 2002, '小芳', 20 );

console.log( '- '.repeat(10) );

// 定义"类"属性(即静态属性)
Student.school = '开发喵学院';
// 定义"类"方法(即静态方法)
Student.show = function(){
    console.log( Student.school );
}

Student.show();

// 尝试通过实例去调用类方法
// instance.show(); // TypeError: instance.show is not a function
